/********************************************************** Projet : tp_1s.prj Fichier(s) : TP_1s.c Objet : Introduction au C sur microcontroleur Gestion du carrefour avec une base de temps logicielle Auteurs : Hensinger Benoît / Cuenot Gaël Groupe : RLI 1 Date création : 09 - 11 - 2001 **********************************************************/ // Fichiers à inclure : #include // Commandes du moniteur de mise au point #include // déclaration des registres interne au µC 80C535(SFR) #include // Commandes de l'afficheur LCD #include // Equivalences : #define OFF 0 #define ON 1 // Fonctions externes : // Fonctions locales (Prototypes) : void tempo(unsigned int); // Fonction temporisation (delai) void select_mode(void); // Fonction selection void mode_off(void); // Fonction mode OFF void mode_jour(void); // Fonction mode JOUR void mode_nuit(void); // Fonction mode NUIT void mode_clign(void); // Fonction mode CLIGNOTANT void error(void); // Fonction d'erreur au cas ou aucun mode valide ne serai selectionne // Definitions particulières (zone SFR ou RAM externe) : at 0x90 sbit in_bpmode; // in_bpmode est le nom donné à la ligne P1.0 (adr. 0x90) at 0xFC sbit out_led; // out_led est le nom donné à la led P5.4 (jour) // Variables Globales : code char d123456=125; unsigned char Tab_voit [5]={0x21,0x22,0x24,0x0C,0x14,0x24} // Tableau de valeurs des feux des voies principale et secondaire unsigned char Tab_piet [5]={0x09,0x05,0x05,0x06,0x06,0x05} // Tableau de valeurs des feux pietons unsigned char Tab_Tmp [5]={10000,1000,1000,5000,1000,1000} // Tableau de valeurs des tempo int state=0,mode=0; // ================ ZONE PROGRAMME ============================== /******************************************************** Nom : main() Objet : gestion de la led on/off P5.4 par le bouton mode P1.0 Paramètres : - d'appel : aucun - de retour : aucun *********************************************************/ void main() { clrscr(); printf("---> TP 1S <---\n"); printf("-> Mode: OFF <--"); P4=0; P5=0; I3FR=1; // front montant sur P1.0 pour detection du mode IEX3=0; // reset flag mode_off(void); // Au demarragedu programme le carrefour est en mode OFF while(1) // boucle infinie { if(IEX3 == 1) // Test si BP1.0 est appuye (selection) { select_mode(); } } } // end main /******************************************************** Nom : select_mode Objet : Selection du mode de fonctionnment des feux. Paramètres : - d'appel : aucun - de retour : aucun *********************************************************/ void select_mode(void) { tempo(100); IEX3=0; // reset du flag mode=mode++; if(mode > 3) mode=0; P5=(P5 & 0x0F) | Tab_val[mode]; switch (mode) { case 0: mode_off(void) break; case 1: mode_jour(void) break; case 2: mode_nuit(void) break; case 3: mode_clign(void) break; default: error(void) break; } } /******************************************************** Nom : tempo Objet : base de temps logicielle de 1 ms Paramètres : - d'appel : durée de la tempo en ms - de retour : aucun *********************************************************/ void tempo(unsigned int t) { int ttempo; while (t != 0) { for (ttempo = 1;ttempo < 493;ttempo++); t--; // décrémentation de la variable de contrôle } } // end tempo